67 二进制求和
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
** 输入:**a = "11", b = "1" 输出:"100"
示例 2:
** 输入:**a = "1010", b = "1011" 输出:"10101"
语言特性:BigInt
ts
function addBinary(a: string, b: string): string {
let result = (BigInt(`0b${a}`) + BigInt(`0b${b}`)).toString(2);
return result;
}
1
2
3
4
2
3
4
算法思路
ts
var addBinary = function(a, b) {
let ans = ""; // 用于保存结果(从低位到高位的二进制表示)
let ca = 0; // 用于保存进位(carry)
// 循环直到两个字符串的所有位都被处理完
for (let i = a.length - 1, j = b.length - 1; i >= 0 || j >= 0; i--, j--) {
let sum = ca; // 当前位的和从进位开始
// 如果 a 中还有剩余位,取当前位的值,否则用 0 补充
sum += i >= 0 ? parseInt(a[i]) : 0;
// 如果 b 中还有剩余位,取当前位的值,否则用 0 补充
sum += j >= 0 ? parseInt(b[j]) : 0;
// 当前位的二进制值是 sum % 2
ans += sum % 2;
// 计算新的进位
ca = Math.floor(sum / 2);
}
// 如果最终进位为 1,则添加到结果中
ans += ca == 1 ? ca : "";
// 结果是从低位到高位得到的,所以需要反转
return ans.split('').reverse().join('');
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
整体思路是将两个字符串较短的用 0 补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果。
在进行计算时直接拼接字符串,会得到一个反向字符,需要最后再进行翻转